home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / main.s < prev    next >
Text File  |  2000-01-24  |  9KB  |  476 lines

  1.     .include    doscall.mac
  2.     .include    iocscall.mac
  3.     .include    global.mac
  4.  
  5. ;----------------------------------------------------------------
  6. ;プログラムの先頭
  7.     .text
  8.     .align    4,$2048
  9. program_head::
  10.  
  11. ;----------------------------------------------------------------
  12. ;実行開始位置
  13.     .text
  14.     .align    4,$2048
  15. exec_entry:
  16.     lea.l    (16,a0),a0
  17.     suba.l    a0,a1
  18.     movem.l    a0-a1,-(sp)
  19.     DOS    _SETBLOCK
  20.     addq.l    #8,sp
  21.  
  22.     lea.l    stack_top,sp
  23.  
  24.     pea.l    (trap14_routine,pc)
  25.     move.w    #TRAP14_VECTOR>>2,-(sp)
  26.     DOS    _INTVCG
  27.     move.l    d0,trap14_old_vector
  28.     DOS    _INTVCS
  29.     addq.l    #6,sp
  30.  
  31.     lea.l    (main,pc),a0
  32.     moveq.l    #-1,d0
  33.     bsr    takeback
  34.     move.l    d0,d7
  35.  
  36. 1:    tst.b    cursor_level
  37.     beq    2f
  38.     bsr    curload
  39.     bra    1b
  40. 2:
  41.  
  42.     tst.b    extra_flag
  43.     beq    2f
  44.  
  45.     bsr    super
  46.     move.w    sr,-(sp)
  47.     ori.w    #$0700,sr
  48.  
  49.     move.l    timera_old_vector,d0
  50.     beq    1f
  51.     move.l    d0,TIMERA_VECTOR
  52.     clr.l    timera_old_vector
  53.     bclr.b    #5,IMRA            ;TIMERA割り込みマスク
  54.     bclr.b    #5,IERA            ;TIMERA割り込み禁止
  55.   .if TIMERA_MODE=8
  56.     tst.b    timera_old_aer
  57.     beq    @f
  58.     bset.b    #4,AER            ;VDISP信号が0→1(垂直帰線→垂直表示)でカウント
  59. @@:
  60.   .endif
  61.     move.b    timera_old_tacr,TACR
  62. 1:
  63.     move.l    extra_keyin_full_old_vector,d0
  64.     beq    @f
  65.     move.l    d0,KEYIN_FULL_VECTOR
  66.     clr.l    extra_keyin_full_old_vector
  67. @@:
  68.     move.w    (sp)+,sr
  69.     bsr    user
  70. 2:
  71.  
  72.     bsr    free_buffer
  73.  
  74.     tst.b    nmi_aborted
  75.     beq    1f
  76.     bsr    silent_ecrlf
  77.     move.w    #EXIT_NMI,exit_code
  78.     lea.l    (m_nmi_aborted,pc),a0
  79.     bsr    eprintcrlf
  80.   .if NMI_PC
  81.     lea.l    (m_nmi_pc,pc),a0
  82.     bsr    eprint
  83.     move.l    nmi_pc,d0
  84.     bsr    h8tos_eprint
  85.     bsr    ecrlf
  86.   .endif
  87.     bra    9f
  88.  
  89. 1:    tst.b    trap14_aborted
  90.     beq    1f
  91.     bsr    silent_ecrlf
  92.     move.w    #EXIT_TRAP14,exit_code
  93.     bsr    print_trap14_message
  94.     bra    9f
  95.  
  96. 1:    tst.b    poweroff_aborted
  97.     beq    1f
  98.     bsr    silent_ecrlf
  99.     move.w    #EXIT_POWEROFF,exit_code
  100.     lea.l    (m_poweroff_aborted,pc),a0
  101.     bsr    eprintcrlf
  102.     bra    9f
  103.  
  104. 1:    tst.b    break_aborted
  105.     beq    1f
  106.     bsr    silent_ecrlf
  107.     move.w    #EXIT_BREAK,exit_code
  108.     lea.l    (m_break_aborted,pc),a0
  109.     bsr    eprintcrlf
  110.     bra    9f
  111.  
  112. 1:    tst.b    ctrlc_aborted
  113.     beq    1f
  114.     bsr    silent_ecrlf
  115.     move.w    #EXIT_CTRLC,exit_code
  116.     lea.l    (m_ctrlc_aborted,pc),a0
  117.     bsr    eprintcrlf
  118.     bra    9f
  119.  
  120. 1:    move.b    esc_aborted,d0
  121.     beq    1f
  122.     bsr    silent_ecrlf
  123.     move.w    #EXIT_ESC,exit_code
  124.     lea.l    (m_esc_aborted,pc),a0
  125.     addq.b    #1,d0
  126.     beq    @f
  127.     lea.l    (m_q_aborted,pc),a0
  128. @@:    bsr    silent_eprintcrlf
  129.     bra    9f
  130.  
  131. 1:
  132. 9:
  133.  
  134. ;SCSI動作中にアボートしたときはSCSIバスリセットを行う
  135.     cmpi.w    #$00F5,abort_iocs_in_progress
  136.     beq    @f
  137.     tst.b    scsicmd_in_progress
  138.     beq    1f
  139. @@:    lea.l    (m_scsi_reset_yesno,pc),a0
  140.     bsr    eprint
  141.     bsr    yesno            ;本来は標準入力ではなくエラー入力を使うべき
  142.     bsr    ecrlf
  143.     tst.l    d0
  144.     beq    2f
  145.     lea.l    (m_scsi_reset_in_progress,pc),a0
  146.     bsr    eprintcrlf
  147.     SCSI    _S_RESET
  148.     lea.l    (m_scsi_reset_done,pc),a0
  149.     bsr    eprint
  150.     bsr    inkey            ;本来は標準入力ではなくエラー入力を使うべき
  151.     bsr    ecrlf
  152.     bra    2f
  153. 1:    bsr    tini_cdrom        ;エラー無視
  154. 2:
  155.  
  156. 1:    tst.b    break_kill_level
  157.     beq    2f
  158.     bsr    break_load
  159.     bra    1b
  160. 2:
  161.  
  162.     bsr    mpu_cache_load
  163.  
  164.     tst.w    exit_code
  165.     bne    @f
  166.     tst.b    list_flag
  167.     bne    @f
  168.     tst.b    conv_flag
  169.     bne    @f
  170.     lea.l    (m_done,pc),a0
  171.     bsr    silent_eprintcrlf
  172. @@:
  173.  
  174.     tst.b    extra_flag
  175.     beq    @f
  176.     IOCS    _MS_INIT
  177.     moveq.l    #-1,d1
  178.     moveq.l    #0,d2
  179.     IOCS    _SKEY_MOD
  180. @@:
  181.  
  182.     clr.w    -(sp)
  183.     DOS    _KFLUSH
  184.     addq.l    #2,sp
  185.  
  186.     move.l    d7,d0
  187.     beq    9f
  188.  
  189.     tst.b    trap14_aborted
  190.     beq    1f
  191.     move.w    #EXIT_TRAP14,exit_code
  192.     bsr    print_trap14_message
  193. 1:
  194.  
  195. 9:
  196.  
  197.     move.l    trap14_old_vector,d0
  198.     beq    @f
  199.     move.l    d0,-(sp)
  200.     move.w    #TRAP14_VECTOR>>2,-(sp)
  201.     DOS    _INTVCS
  202.     addq.l    #6,sp
  203.     clr.l    trap14_old_vector
  204. @@:
  205.  
  206. ;ファイル出力中にアボートしたときはクローズしてから出力ファイルを削除する
  207.     move.w    output_fileno,d0
  208.     cmp.w    #1,d0
  209.     ble    1f
  210.     move.w    d0,-(sp)
  211.     DOS    _CLOSE
  212.     addq.l    #2,sp
  213.     move.w    #-1,output_fileno
  214.     move.l    output_filename_ptr,d0
  215.     beq    1f
  216.     move.l    d0,-(sp)
  217.     DOS    _DELETE
  218.     addq.l    #4,sp
  219.     tst.b    trap14_aborted
  220.     bne    @f
  221.     lea.l    (m_output_aborted,pc),a0
  222.     bsr    eprintcrlf
  223. @@:
  224. 1:
  225.  
  226. ;POWER OFFで終了したときは電源を切る
  227.     tst.b    poweroff_aborted
  228.     beq    9f
  229.     bsr    super
  230.     btst.b    #2,GPIPDR        ;POWERスイッチ(0=ON,1=OFF)
  231.     beq    8f
  232.   .if POWEROFF_STANDBY
  233. ;POWEROFF_STANDBYで指定された秒数だけ待つ
  234. ;  この方法では1分以上待つことはできない
  235.     lea.l    (m_poweroff_standby,pc),a0
  236.     bsr    eprint
  237.     move.w    ONTIME_COUNTER,d2    ;次の目標カウンタ
  238.     moveq.l    #2,d1            ;表示桁数
  239.     moveq.l    #POWEROFF_STANDBY-1,d4    ;残り秒数
  240. 4:    sub.w    #100,d2
  241.     bgt    @f
  242.     add.w    ONTIME_COUNT,d2
  243. @@:
  244. 1:    btst.b    #2,GPIPDR        ;POWERスイッチ(0=ON,1=OFF)
  245.     beq    7f
  246.     move.w    ONTIME_COUNTER,d3
  247.     sub.w    d2,d3
  248.     bgt    @f
  249.     add.w    ONTIME_COUNT,d3
  250. @@:    add.w    d3,d3
  251.     cmp.w    ONTIME_COUNT,d3
  252.     ble    1b
  253.     lea.l    (m_power_off_time_2,pc),a0
  254.     bsr    eprint
  255.     move.l    d4,d0
  256.     bsr    iusing_eprint
  257.     lea.l    (m_power_off_time_1,pc),a0
  258.     bsr    eprint
  259.     dbra    d4,4b
  260.   .endif
  261.     move.l    #('X68'<<8)+$01,d0
  262.     trap    #10
  263. 7:    lea.l    (m_poweroff_canceled,pc),a0
  264.     bsr    eprintcrlf
  265. 8:    bsr    user
  266. 9:
  267.  
  268.     move.w    exit_code,-(sp)
  269.     DOS    _EXIT2
  270.  
  271. m_output_aborted:    .dc.b    '中止しました',0
  272.   .if POWEROFF_STANDBY
  273. m_poweroff_standby:
  274.     .dc.b    '─────',13,10
  275.     .if POWEROFF_STANDBY>=10
  276.     .dc.b    '0'+POWEROFF_STANDBY/10
  277.     .else
  278.     .dc.b    ' '
  279.     .endif
  280.     .dc.b    '0'+POWEROFF_STANDBY.mod.10
  281.     .dc.b    ' 秒後に電源を切ります',13,10
  282.     .dc.b    '電源を切らない場合はフロントスイッチを ON に戻して下さい',13,10
  283.     .dc.b    '残り '
  284.     .if POWEROFF_STANDBY>=10
  285.     .dc.b    '0'+POWEROFF_STANDBY/10
  286.     .else
  287.     .dc.b    ' '
  288.     .endif
  289.     .dc.b    '0'+POWEROFF_STANDBY.mod.10
  290. m_power_off_time_1:
  291.     .dc.b    ' 秒',0
  292. m_power_off_time_2:
  293.     .dc.b    8,8,8,8,8,0
  294.   .endif
  295. m_poweroff_canceled:
  296.     .dc.b    13,'─────',13,10
  297.     .dc.b    '中止しました',0
  298.     .even
  299.  
  300.     .data
  301.     .even
  302. exit_code::        .dc.w    0
  303.     .align    4
  304. trap14_old_vector:    .dc.l    0
  305.  
  306.     .bss
  307.     .align    4
  308.         .ds.b    1024*64
  309. stack_top:
  310.  
  311. ;----------------------------------------------------------------
  312. ;メインルーチン
  313. ;>d0.l:必ず0を返す
  314.     .text
  315.     .align    4,$2048
  316. main:
  317.   .if TEST_ABSOLUTE=0
  318.     lea.l    base,a6
  319.   .endif
  320.  
  321.     bsr    machine_check
  322.     bsr    mpu_check
  323.     bsr    mpu_cache_on
  324.  
  325.   .if FORCE_CHANGE_SCSIDRV=0
  326.     bsr    scsidrv_check
  327.   .endif
  328.  
  329.     lea.l    (1,a2),a0
  330.     bsr    get_params
  331.     bmi    exit
  332.  
  333.     bsr    silent_print_banner
  334.  
  335.     tst.b    extra_flag
  336.     beq    2f
  337.     bsr    timera_check
  338.     beq    2f
  339.     bsr    eaprintcrlf
  340.     bra    exit
  341. 2:
  342.  
  343.     bsr    timerd_check
  344.     beq    2f            ;TIMER-D割り込みは未使用
  345.     tst.b    tdpause_flag
  346.     beq    1f            ;-tdpauseでないのでエラー
  347.     cmp.l    #-2,d0
  348.     beq    2f            ;-tdpauseでHumanが使用中なので使用可能
  349. 1:    bsr    eaprintcrlf
  350.     bra    exit
  351. 2:
  352.  
  353.     bsr    malloc_buffer
  354.     bmi    exit
  355.  
  356.     bsr    make_table
  357.  
  358.     bsr    init_data
  359.     bmi    exit
  360.  
  361.     tst.b    extra_flag
  362.     bne    1f
  363.     lea.l    (m_start_message1,pc),a0
  364.     bsr    silent_eprintcrlf
  365.     lea.l    (m_start_message2,pc),a0
  366.     bsr    silent_eprintcrlf
  367.     bra    2f
  368. 1:    lea.l    (m_start_message3,pc),a0
  369.     bsr    silent_eprintcrlf
  370.     lea.l    (m_start_message4,pc),a0
  371.     bsr    silent_eprintcrlf
  372. 2:
  373.  
  374.     tst.b    extra_flag
  375.     beq    2f
  376.  
  377.     bsr    super
  378.     move.w    sr,-(sp)
  379.     ori.w    #$0700,sr
  380.  
  381.     move.b    TACR,timera_old_tacr
  382.     move.b    #$00,TACR        ;TIMERAカウント禁止
  383.   .if TIMERA_MODE=8
  384.     bclr.b    #4,AER            ;VDISP信号が1→0(垂直表示→垂直帰線)でカウント
  385.     sne.b    timera_old_aer
  386.   .endif
  387.     bset.b    #5,IERA            ;TIMERA割り込み許可
  388.     bset.b    #5,IMRA            ;TIMERA割り込みマスク解除
  389.     move.l    TIMERA_VECTOR,timera_old_vector
  390.     move.l    #timera_routine,TIMERA_VECTOR
  391.     move.b    #TIMERA_COUNT.and.255,TADR    ;TIMERAカウンタ設定
  392.     move.b    #TIMERA_MODE,TACR    ;TIMERAカウント開始
  393.  
  394.     move.l    KEYIN_FULL_VECTOR,extra_keyin_full_old_vector
  395.     move.l    #extra_keyin_full_routine,KEYIN_FULL_VECTOR
  396.  
  397.     move.w    (sp)+,sr
  398.     bsr    user
  399. 2:
  400.  
  401.     tst.b    extra_flag
  402.     beq    @f
  403.     IOCS    _MS_CUROF
  404.     moveq.l    #0,d1
  405.     moveq.l    #0,d2
  406.     IOCS    _SKEY_MOD
  407. @@:
  408.  
  409.     bsr    curhide
  410.  
  411. core_loop_loop:
  412.     lea.l    param_buf,a2
  413.     tst.l    (pb_ptr,a2)
  414.     bmi    exit
  415. core_loop:
  416.     move.l    a2,current_param_ptr
  417.     bsr    core_entry
  418.     bmi    exit
  419.  
  420.     tst.w    exit_code
  421.     bne    exit
  422.  
  423.     movea.l    next_param_ptr,a2
  424.     tst.l    (pb_ptr,a2)
  425.     bpl    core_loop
  426.  
  427.     tst.b    loop_flag
  428.     bne    core_loop_loop
  429.  
  430. exit:
  431.     moveq.l    #0,d0
  432.     rts
  433.  
  434. m_start_message1:    .dc.b    '[ESC]/[Q] で終了、[CTRL+C]/[BREAK]/[INTERRUPT]/POWER OFF で強制終了できます',0
  435. m_start_message2:    .dc.b    '[TAB] でスキップ、[F] でフェードアウトできます',0
  436. m_start_message3:
  437.   .if TEST_ESC
  438.             .dc.b    '[ESC] で終了、'
  439.   .endif
  440.   .if TEST_BREAK
  441.             .dc.b    '[BREAK]/'
  442.   .endif
  443.             .dc.b    '[INTERRUPT]/POWER OFF で強制終了できます',0
  444. m_start_message4:    .dc.b    'キー/パッド/マウスのボタン操作でフェードアウト、終了できます',0
  445. m_nmi_aborted:        .dc.b    '[INTERRUPT] で強制終了しました',0
  446. m_poweroff_aborted:    .dc.b    'POWER OFF で強制終了しました',0
  447. m_break_aborted:    .dc.b    '[BREAK] で強制終了しました',0
  448. m_ctrlc_aborted:    .dc.b    '[CTRL+C] で強制終了しました',0
  449. m_esc_aborted:        .dc.b    '[ESC] で終了しました',0
  450. m_q_aborted:        .dc.b    '[Q] で終了しました',0
  451.   .if NMI_PC
  452. m_nmi_pc:        .dc.b    '  PC=$',0
  453.   .endif
  454. m_scsi_reset_yesno:    .dc.b    'SCSI コマンドを中断してしまったようです。'
  455.             .dc.b    'SCSI バスリセットを行いますか (y/n)? ',0
  456. m_scsi_reset_in_progress:    .dc.b    'SCSI バスリセット実行中です',13,10
  457.             .dc.b    'すべての SCSI 装置のアクセスランプが消えるまで、何も操作しないで下さい',0
  458. m_scsi_reset_done:    .dc.b    'すべての SCSI 装置のアクセスランプが消えるまで待ってから、何かキーを押して下さい',0
  459. m_done:            .dc.b    '正常終了しました',0
  460.     .even
  461.  
  462.     .data
  463.     .align    4
  464. extra_keyin_full_old_vector:    .dc.l    0
  465. timera_old_vector:    .dc.l    0
  466.  
  467. timera_old_ierb:    .dc.b    0
  468. timera_old_imrb:    .dc.b    0
  469. timera_old_tacr:    .dc.b    $08
  470.   .if TIMERA_MODE=8
  471. timera_old_aer:        .dc.b    $08
  472.   .endif
  473.  
  474. ;----------------------------------------------------------------
  475.     .end    exec_entry
  476.